package String;

import java.util.*;

/**
 * File Name: CanPalindromeNumStr
 * Date: 2020-04-01 17:07
 * Author: liangling
 * Description
 * 给定一个字符串，编写一个函数判定其是否为某个回文串的排列之一。
 * 回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
 * 回文串不一定是字典当中的单词。
 * eg:
 * 输入："tactcoa"
 * 输出：true（排列有"tacocat"、"atcocta"，等等）
 *
 *解题思路：
 * 1.明白回文串的特点:a.字符串长度可以奇数或偶数 b.字符串长度为1也是回文串 c.回文串只有一个字符个数为奇数，
 * 其余字符个数为偶数，若出现2个或2个以上字符个数为奇数的字符，则表示非回文串
 * 2.将字符串转为字符数组
 * 3.使用一个Map用来存放统计字符数组中每个字符出现的次数
 * key : 字符数组中每个字符
 * value: 字符出现的次数
 * 4.遍历Map统计只出现奇数次的字符，超过一个字符只有奇数个存在，就不是回文串
 *
 *
 *
 */
public class CanPalindromeNumStr {

    public static void main(String[] args) {
        String s = "code";
        System.out.println(canPermutePalindrome(s));

    }

    private static Boolean canPermutePalindrome(String s) {
        if (s.length() == 1) {
            return false;
        }

        char[] temp = s.toCharArray();
        //统计字符数组中每个字符各有几个
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < temp.length; i++) {
            if (map.containsKey(temp[i])) {
                map.put(temp[i], map.get(temp[i]) + 1);
            } else {
                map.put(temp[i], 1);
            }
        }

        int count = 0;//统计数组中出现奇数个字符
        for (Character key : map.keySet()) {
            int val = map.get(key);
            if (val % 2 != 0) {
                count++;
                continue;
            }
        }
        //出现一个以上的奇数个字符，则不是回文串
        if (count > 1) {
            return false;
        }

        return true;
    }
}
